#pragma once

#include <iostream>
#include <assert.h>
#include <vector>
#include <list>

using std::list;
using std::vector;
using std::cout;
using std::endl;


namespace wu
{
	//适配器/配接器
	template <class T, class Container = deque<T>>
	class stack
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		
		void pop()
		{
			_con.pop_back();
		}

		size_t size() const
		{
			return _con.size();
		}

		const T& top()
		{
			return _con.back();//返回栈顶元素的引用
		}

		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};

	void test_stack1()
	{
		stack<int> st;
		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);
		st.push(5);

		while (!st.empty())
		{
			cout << st.top() << " ";
			st.pop();
		}
		cout << endl;

		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);
		int ret = st.top();
		cout << ret << endl;
	}

	void test_stack2()
	{
		stack<int ,list<int>> st;
		st.push(1);
		st.push(2);
		st.push(3);
		
		cout << st.top() << endl;
		while (!st.empty())
		{
			cout << st.top() << " ";
			st.pop();
		}
		cout << endl;
	}

}
